package com.army.study.slice;

import com.army.study.ResourceTable;
import com.army.study.dialog.CreateLetterDialog;
import com.army.study.dialog.PreviewLetterDialog;
import com.army.study.provider.LetterProvider;
import com.army.study.util.DistributedFileUtil;
import ohos.aafwk.ability.AbilitySlice;
import ohos.aafwk.content.Intent;
import ohos.agp.components.*;
import ohos.data.distributed.common.*;
import ohos.data.distributed.user.SingleKvStore;
import ohos.media.image.PixelMap;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class MainAbilitySlice extends AbilitySlice {
    // 列表容器
    private ListContainer lcList;
    // 列表数据集
    private final List<String> listData = new ArrayList<>();
    // 信件适配器
    private LetterProvider provider;
    // 新建信件
    private DirectionalLayout addLetter;
    // 无信件时提示信息
    private Text textEmptyHint;
    // 分布式工具类
    private DistributedFileUtil fileUtil;
    // 分布式数据库管理器
    private KvManager kvManager;
    // 分布式数据库
    private SingleKvStore singleKvStore;
    // 数据库名称
    private static final String STORE_NAME = "LetterStore";
    // 存入的是否有文件更新
    private static final String KEY_IS_FILE_UPDATE = "keyIsFileChange";
    // 像素图
    private PixelMap pixelMap;

    /**
     * 程序主入口
     * @param intent
     */
    @Override
    public void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);
        // 初始化分布式文件
        fileUtil = new DistributedFileUtil(this);
        // 初始化界面
        initUI();
        // 设置监听事件
        setListener();
        // 初始化数据库
        initDatabase();
        // 主线程更新分布式列表数据
        getUITaskDispatcher().delayDispatch(this::getListData,200);
    }

    /**
     * 初始化界面
     */
    private void initUI() {
        Image imageBack = (Image) findComponentById(ResourceTable.Id_image_titleBar_back);
        addLetter = (DirectionalLayout) findComponentById(ResourceTable.Id_dl_titleBar_edit);
        Image imageEdit = (Image) findComponentById(ResourceTable.Id_image_titleBar_edit);
        textEmptyHint = (Text) findComponentById(ResourceTable.Id_text_main_EmptyHint);
        lcList = (ListContainer) findComponentById(ResourceTable.Id_lc_main_list);
        imageBack.setVisibility(Component.HIDE);
        imageEdit.setPixelMap(ResourceTable.Media_add);
        provider = new LetterProvider(this, listData);
        lcList.setItemProvider(provider);
    }
    /**
     * 设置监听事件
     */
    private void setListener() {
        addLetter.setClickedListener(component -> {
            CreateLetterDialog dialog=new CreateLetterDialog(this);
            dialog.setOnCallBack(name -> {
                // 创建文件
                String deviceId = name.split("-")[0];
                String fileName = deviceId + "-" + String.valueOf (new Date().getTime()).substring(0,10);
                String letterContent = name.split("-")[1];
                pixelMap = fileUtil.writeLetter(fileName, letterContent);
                // 更新数据，主要让分布式中的设备收到数据变化监听
                singleKvStore.putBoolean(KEY_IS_FILE_UPDATE,true);
            });
            dialog.show();
        });

        lcList.setItemClickedListener((listContainer, component, position, id) -> {
            String fileName = (String) listContainer.getItemProvider().getItem(position);
            // @TODO 点击打开Dialog 查看图片内容
            pixelMap = fileUtil.readImage(fileName, "");

            PreviewLetterDialog dialog=new PreviewLetterDialog(this, pixelMap);
            dialog.show();
        });
    }

    /**
     * 初始化数据库
     */
    private void initDatabase() {
        // 创建分布式数据库管理器
        kvManager = KvManagerFactory.getInstance().createKvManager(new KvManagerConfig(this));

        // 数据库配置
        Options options = new Options();
        // 设置数据库不存在时是否创建
        options.setCreateIfMissing(true)
                // 设置数据库是否加密
                .setEncrypt(false)
                //数据库类型
                .setKvStoreType(KvStoreType.SINGLE_VERSION);
        // 创建分布式数据库
        singleKvStore = kvManager.getKvStore(options, STORE_NAME);
        // 监听数据库数据改变
        singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL, new KvStoreObserver() {
            @Override
            public void onChange(ChangeNotification changeNotification) {
                // 在UI主线程更新UI
                getUITaskDispatcher().syncDispatch(() -> {
                    getListData();
                });
            }
        });
    }

    /**
     * 获取列表数据
     */
    private void getListData(){
        // 清空旧数据
        listData.clear();
        // 添加分布式文件列表
        listData.addAll(fileUtil.getFileList());
        // 判断列表数据
        if(listData.isEmpty()){
            // 隐藏列表
            lcList.setVisibility(Component.HIDE);
            // 显示无数据提示信息
            textEmptyHint.setVisibility(Component.VISIBLE);
        }else {
            // 显示列表
            lcList.setVisibility(Component.VISIBLE);
            // 隐藏无数据提示信息
            textEmptyHint.setVisibility(Component.HIDE);
        }
        // 通知数据更新
        provider.notifyDataChanged();
    }

    @Override
    public void onActive() {
        super.onActive();
    }

    @Override
    public void onForeground(Intent intent) {
        super.onForeground(intent);
    }
}
